﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Game.Classes.Entities.GameEntities;

/*
Classe incompleta. Autor: Yamanaka
NAO MECHER SEM AUTORIZAÇÃO; QUALQUER DUVIDA OU SUGESTAO, FALE COMIGO.
PS: Temporariamente com algoritmos fail. < checar isso o quanto antes (peça ajuda)
*/

namespace Super_Pong.Classes
{
    public class Shape
    {
        #region Enums
        //Tipo de formato
        public enum ShapeType
        {
            STRAIGHT,               //barra reta
            CONVEX,                 //barra circular convexa (implementar depois)
            CONCAVE,                //barra circular concava
            POINTED_OUTSIDE,        //barra triangular "convexa"
            POINTED_INSIDE          //barra triangular "concava"
        }   //Adicionar mais caso necessario

        #endregion

        #region Atributos
        ShapeType shapeType;     //o tipo de formato da barra
        Vector2[] points;       //vetor que contem os pontos importantes para realizar checagens de colisao.
        float multiplier;      //usado para acelerar ou desacelerar objetos apos colisoes.
        #endregion

        #region Construtor
        /// <summary>
        /// Construtor para o formato da barra
        /// </summary>
        /// <param name="st">o tipo do formato</param>
        /// <param name="pts">os pontos importantes (para um formato circular coloque o raio e os pontos superior e inferior da barra, para um formato reto coloque o ponto superior, inferior e central da barra)</param>
        /// <param name="multiplier">coeficiente de desaceleracao/aceleracao apos colisao</param>
        public Shape(ShapeType st, Vector2[] pts, float multiplier)
        {
            shapeType = st;
            points = pts;
        }
        #endregion

        #region Metodos
        public bool CollisionCheck(ShapeType shapeType, Ball ball)
        {
            switch (shapeType)
            {
                case ShapeType.STRAIGHT:
                    //Checa se a bola esta entre os extremos da barra
                    if (ball.getPosition().Y >= points[0].Y && ball.getPosition().Y + ball.getAnimation().GetCurrentImage().Height <= points[1].Y)
                    {
                        //cria um vetor vertical que representa a altura da barra
                        Vector2 barHeight = points[1] - points[0];
                        //cria um vetor representando um ponto da barra ate a bola
                        Vector2 pointBallDist = ball.getPosition() - points[0];
                        //Calcula o angulo formado entre os vetores criados.
                        float theta = (float)Math.Acos((barHeight.X * pointBallDist.X + barHeight.Y + pointBallDist.Y) / (barHeight.Length() * pointBallDist.Length()));
                        //Utiliza o angulo numa formula basica de seno para achar a distancia entre a bola ate a barra
                        float barBallDist = (float)Math.Sin(theta) * pointBallDist.Length();
                        //Se a distancia entre a bola e a barra for menor que o raio da bola, entao ha colisao.
                        if (barBallDist <= ball.GetRadius())
                        {
                            return true;
                        }
                    }
                    break;
                case ShapeType.CONCAVE:
                    break;
                case ShapeType.CONVEX:
                    break;
                case ShapeType.POINTED_INSIDE:
                    break;
                case ShapeType.POINTED_OUTSIDE:
                    break;
            }
            return false;
        }
        #endregion

    }
}
